www.gusucode.com > VC++ 以多种方式处理位图文件的例子源码程序 > VC++ 以多种方式处理位图文件的例子源码程序\code\app.cpp

    #include "stdafx.h"
#include "app.h"
#include "MainFrm.h"
#include "ChildFrm.h"
#include "Doc.h"
#include "View.h"
#include "NewImageDlg.h"
#include "combinedlg.h"
//download by http://www.NewXing.com
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


CApp* GetApp()
{
  return (CApp*) AfxGetApp();
}

CMainFrame* GetMainFrame()
{
  return (CMainFrame*) AfxGetMainWnd();
}


BEGIN_MESSAGE_MAP(CApp, CWinApp)
	//{{AFX_MSG_MAP(CApp)
	ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
	ON_COMMAND(ID_EDIT_EMPTY, OnEditEmpty)
	ON_UPDATE_COMMAND_UI(ID_EDIT_EMPTY, OnUpdateEditEmpty)
	ON_COMMAND(ID_EDIT_PASTE_IMAGE, OnEditPasteImage)
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE_IMAGE, OnUpdateEditPasteImage)
	ON_COMMAND(ID_FILE_NEW, OnFileNew)
	ON_COMMAND(ID_WINDOW_CLOSEALL, OnWindowCloseall)
	ON_UPDATE_COMMAND_UI(ID_WINDOW_CLOSEALL, OnUpdateWindowCloseall)
	ON_COMMAND(ID_CHANNEL_COMBINE, OnChannelCombine)
	ON_UPDATE_COMMAND_UI(ID_CHANNEL_COMBINE, OnUpdateChannelCombine)
	//}}AFX_MSG_MAP
	ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
	ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
	ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()

CApp::CApp()
{
  m_bNewFromPaste = FALSE;
  m_nNewWidth = 320;
  m_nNewHeight = 200;
}

CApp theApp;

BOOL CApp::InitInstance()
{
  SetRegistryKey(_T("PJ Naughter"));
	Enable3dControls();			
	LoadStdProfileSettings();

	CMultiDocTemplate* pDocTemplate;
	pDocTemplate = new CMultiDocTemplate(
		IDR_DIBTESTYPE,
		RUNTIME_CLASS(CDibtestDoc),
		RUNTIME_CLASS(CChildFrame),
		RUNTIME_CLASS(CDibtestView));
	AddDocTemplate(pDocTemplate);

	CMainFrame* pMainFrame = new CMainFrame;
	if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
		return FALSE;
	m_pMainWnd = pMainFrame;

  m_pMainWnd->DragAcceptFiles();

	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);

  if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew)
    cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

	if (!ProcessShellCommand(cmdInfo))
		return FALSE;

	pMainFrame->ShowWindow(m_nCmdShow);
	pMainFrame->UpdateWindow();

	return TRUE;
}

void CApp::OnAppAbout()
{
	CAboutDlg aboutDlg;
	aboutDlg.DoModal();
}

void CApp::OnEditPasteImage() 
{
  POSITION posTemplate = GetFirstDocTemplatePosition();
  CDocTemplate* pDocTemplate = GetNextDocTemplate(posTemplate);
  m_bNewFromPaste = TRUE;
  CDibtestDoc* pDocument = (CDibtestDoc*) pDocTemplate->OpenDocumentFile(NULL);
  pDocument->m_Dib.PasteFromClipboard();
  pDocument->UpdateHistogramData();
  pDocument->SetModifiedFlag(TRUE);
  pDocument->UpdateAllViews(NULL);
  m_bNewFromPaste = FALSE;
}

void CApp::OnUpdateEditPasteImage(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(CDibImage::PasteAvailable());
}

void CApp::OnEditEmpty() 
{
	if (OpenClipboard(NULL))
	{
		if (EmptyClipboard())
		CloseClipboard();
	}
}

void CApp::OnUpdateEditEmpty(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(CountClipboardFormats() != 0);
}

void CApp::OnFileNew() 
{
  CNewImageDlg dlg;
  dlg.m_nWidth = m_nNewWidth;
  dlg.m_nHeight = m_nNewHeight;
  if (dlg.DoModal() == IDOK)
  {
    m_nNewWidth = dlg.m_nWidth;
    m_nNewHeight = dlg.m_nHeight;
    CWinApp::OnFileNew();
  }
}

void CApp::OnWindowCloseall() 
{
  POSITION posTemplate = GetFirstDocTemplatePosition();
  while (posTemplate != NULL) 
  {
    CDocTemplate* pTemplate = GetNextDocTemplate(posTemplate);
    ASSERT(pTemplate->IsKindOf(RUNTIME_CLASS(CDocTemplate)));
    POSITION posDoc = pTemplate->GetFirstDocPosition();
    while (posDoc != NULL) 
    {
      CDocument* pDoc = pTemplate->GetNextDoc(posDoc);
      if (!pDoc->SaveModified())
        return;        // user aborted
      pDoc->OnCloseDocument();
    }
  }
}


int CApp::NumberOfOpenDocuments() const
{
	int nOpenDocuments = 0;
  POSITION posTemplate = GetFirstDocTemplatePosition();
  while (posTemplate != NULL) 
  {
    CDocTemplate* pTemplate = GetNextDocTemplate(posTemplate);
    ASSERT(pTemplate->IsKindOf(RUNTIME_CLASS(CDocTemplate)));
    POSITION posDoc = pTemplate->GetFirstDocPosition();
    while (posDoc != NULL) 
    {
      CDocument* pDoc = pTemplate->GetNextDoc(posDoc);
      ++nOpenDocuments;
    }
  }

  return nOpenDocuments;
}


void CApp::OnUpdateWindowCloseall(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(NumberOfOpenDocuments());
}


void CApp::OnChannelCombine() 
{
  CCombineDlg dlg;
  if (dlg.DoModal() == IDOK)
  {
    CDibImage dib;
    if (dib.CombineChannels(*dlg.GetRedImage(), *dlg.GetGreenImage(), *dlg.GetBlueImage()))
    {
      POSITION posTemplate = GetFirstDocTemplatePosition();
      CDocTemplate* pDocTemplate = GetNextDocTemplate(posTemplate);
      m_bNewFromPaste = TRUE;
      CDibtestDoc* pDocument = (CDibtestDoc*) pDocTemplate->OpenDocumentFile(NULL);
      pDocument->m_Dib = dib;
      pDocument->UpdateHistogramData();
      pDocument->SetModifiedFlag(TRUE);
      pDocument->UpdateAllViews(NULL);
      m_bNewFromPaste = FALSE;
    }
    else
      AfxMessageBox(IDS_FAIL_COMBINE);
  }
}

void CApp::OnUpdateChannelCombine(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(NumberOfOpenDocuments());
}






CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()